package Principal;

import java.math.BigDecimal;

import Entidades.Coordenada;
import Entidades.Plano;
import Entidades.Planta;
import Implementacion.RobotDesastres;
import Implementaciones.Cola;
import Implementaciones.Conjunto;
import TDA.ColaTDA;
import TDA.ConjuntoTDA;

public class PrincipalRobot {

	public static void main(String[] args) throws Exception {

		long tInicio = System.currentTimeMillis();
		long tFin;
		RobotDesastres robotDesastres = new RobotDesastres();
		
		int cantPlantas = 4;
		int tamanioPlantas = 3;
		
		Plano plano = armarPlano(cantPlantas, tamanioPlantas);
		
		ConjuntoTDA<Coordenada> coordVictimas = generarVictimas();
		ConjuntoTDA<Coordenada> victimasRescatadas = new Conjunto<Coordenada>(); //En esta implementacion no lo usamos

		ColaTDA<Coordenada> secuenciaPuntosVisitados = new Cola<Coordenada>();
		robotDesastres.RescatarVictimas(plano, coordVictimas, victimasRescatadas, secuenciaPuntosVisitados);

		tFin = System.currentTimeMillis();
		BigDecimal tiempoTotal = new BigDecimal(tFin - tInicio);
		
		System.out.println("Tiempo de resolucion: " + (tiempoTotal.divide(new BigDecimal(1000))).setScale(4) + " segundos");

	}

	/**
	 * 
	 * @param cantPlantas
	 * @param tamanioPlanta
	 * @return
	 */
	public static Plano armarPlano(int cantPlantas, int tamanioPlanta) {

		Plano p = new Plano(cantPlantas);

		Planta pl0 = new Planta(tamanioPlanta, 0);
		for (int i = 0; i < tamanioPlanta; i++) {
			for (int j = 0; j < tamanioPlanta; j++) {
				pl0.setearAccesible(i, j);
			}
		}
		pl0.setearInaccesible(1, 1);

		Planta pl1 = new Planta(tamanioPlanta, 1);
		for (int i = 0; i < tamanioPlanta; i++) {
			for (int j = 0; j < tamanioPlanta; j++) {
				pl1.setearAccesible(i, j);
			}
		}
		pl1.setearInaccesible(1, 1);
		pl1.setearInaccesible(1, 2);

		Planta pl2 = new Planta(tamanioPlanta, 2);
		for (int i = 0; i < tamanioPlanta; i++) {
			for (int j = 0; j < tamanioPlanta; j++) {
				pl2.setearAccesible(i, j);
			}
		}
		pl2.setearInaccesible(1, 0);
		pl2.setearInaccesible(2, 1);
//		pl2.setearInaccesible(1, 2);
		
		Planta pl3 = new Planta(tamanioPlanta, 3);
		for (int i = 0; i < tamanioPlanta; i++) {
			for (int j = 0; j < tamanioPlanta; j++) {
				pl3.setearAccesible(i, j);
			}
		}
		pl3.setearInaccesible(1, 1);		
		pl3.setearInaccesible(2, 1);
		pl3.setearInaccesible(1, 2);

		try {
			p.AgregarPlanta(pl0);
			p.AgregarPlanta(pl1);
			p.AgregarPlanta(pl2);
			p.AgregarPlanta(pl3);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return p;
	}

	public static ConjuntoTDA<Coordenada> generarVictimas() {

		ConjuntoTDA<Coordenada> c = new Conjunto<Coordenada>();
		c.inicializarConjunto();

		c.agregar(new Coordenada(1, 2, 0));

		c.agregar(new Coordenada(2, 0, 1));
		c.agregar(new Coordenada(2, 2, 1));

		c.agregar(new Coordenada(0, 2, 2));
		c.agregar(new Coordenada(1, 1, 2));
		c.agregar(new Coordenada(2, 0, 2));
		c.agregar(new Coordenada(2, 2, 2));
		
		c.agregar(new Coordenada(2, 2, 3));

		return c;

	}
	
	/**
	 * 
	 * @param victimasRescatadas
	 * @param secuenciaPuntosVisitados
	 */
	public static void imprimirResultadoRobot(ConjuntoTDA<Coordenada> victimasRescatadas,
			ColaTDA<Coordenada> secuenciaPuntosVisitados) {
		//esto lo hacemos con dibujarMatriz()
	}

}
